home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / earcd / mus / play / mikmod.lzh / mikmod / mdriver.c < prev    next >
C/C++ Source or Header  |  1997-01-28  |  4KB  |  283 lines

  1. /*
  2.  
  3. Name:
  4. MDRIVER.C
  5.  
  6. Description:
  7. These routines are used to access the available soundcard drivers.
  8.  
  9. Portability:
  10. All systems - all compilers
  11.  
  12. */
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include "mikmod.h"
  16. #include "string.h"
  17.  
  18. void swab(char *sl_buffer,char *sl_buffer2,UWORD stodo)
  19. {
  20. UWORD i;
  21.  
  22. i=stodo>>1;
  23.  
  24. for(i=0;i<stodo;i++)
  25.         {
  26.         *sl_buffer2++ = *(sl_buffer+1);
  27.         *sl_buffer2++ = *sl_buffer;
  28.  
  29.         sl_buffer+=2;
  30.         }
  31.  
  32. }
  33.  
  34.  
  35. DRIVER *firstdriver=NULL,*md_driver;
  36.  
  37. UWORD md_device         =0;
  38. UWORD md_mixfreq        =44100;
  39. UWORD md_mode           =0;
  40. UWORD md_dmabufsize     =8192;
  41. UBYTE md_numchn         =0;
  42. UBYTE md_bpm            =125;
  43.  
  44. static void dummyplay(void)
  45. {
  46. }
  47.  
  48. void (*md_player)(void)=dummyplay;
  49.  
  50. static void *sl_fp;
  51. static SWORD  sl_old;
  52. static UWORD sl_infmt;
  53. static UWORD sl_outfmt;
  54. static SWORD  sl_buffer[1024];
  55.  
  56. static BOOL isplaying=0;
  57.  
  58.  
  59. void SL_Init(FILE *fp,UWORD infmt,UWORD outfmt)
  60. {
  61.     sl_old=0;
  62.     sl_fp=fp;
  63.     sl_infmt=infmt;
  64.     sl_outfmt=outfmt;
  65. }
  66.  
  67.  
  68. void SL_Exit(void)
  69. {
  70. }
  71.  
  72.  
  73. void SL_Load(void *buffer,ULONG length)
  74. {
  75.     SBYTE *bptr=buffer;
  76.     SWORD *wptr=buffer;
  77.     UWORD stodo;
  78.     int t;
  79.  
  80.     /* compute number of samples to load */
  81.     if(sl_outfmt & SF_16BITS) length>>=1;
  82.  
  83.     while(length){
  84.  
  85.         stodo=(length<1024) ? length : 1024;
  86.  
  87.         if(sl_infmt&SF_16BITS){
  88.             fread(sl_buffer,sizeof(SWORD),stodo,sl_fp);
  89. #ifdef MM_BIG_ENDIAN
  90.             if(!(sl_infmt&SF_BIG_ENDIAN))
  91.                 swab((char *)sl_buffer,(char *)sl_buffer,stodo<<1);
  92. #else
  93.                         /* assume machine is little endian by default */
  94.             if(sl_infmt&SF_BIG_ENDIAN)
  95.                 swab((char *)sl_buffer,(char *)sl_buffer,stodo<<1);
  96. #endif
  97.         }
  98.         else{
  99.             SBYTE *s;
  100.             SWORD *d;
  101.  
  102.             fread(sl_buffer,sizeof(SBYTE),stodo,sl_fp);
  103.  
  104.             s=(SBYTE *)sl_buffer;
  105.             d=sl_buffer;
  106.             s+=stodo;
  107.             d+=stodo;
  108.  
  109.                         for(t=0;t<stodo;t++){
  110.                 s--;
  111.                 d--;
  112.                 *d=(*s)<<8;
  113.             }
  114.         }
  115.  
  116.         if(sl_infmt & SF_DELTA){
  117.             for(t=0;t<stodo;t++){
  118.                 sl_buffer[t]+=sl_old;
  119.                 sl_old=sl_buffer[t];
  120.             }
  121.         }
  122.  
  123.         if((sl_infmt^sl_outfmt) & SF_SIGNED){
  124.             for(t=0;t<stodo;t++){
  125.                 sl_buffer[t]^=0x8000;
  126.             }
  127.         }
  128.  
  129.         if(sl_outfmt & SF_16BITS){
  130.             for(t=0;t<stodo;t++) *(wptr++)=sl_buffer[t];
  131.         }
  132.         else{
  133.             for(t=0;t<stodo;t++) *(bptr++)=sl_buffer[t]>>8;
  134.         }
  135.  
  136.         length-=stodo;
  137.     }
  138. }
  139.  
  140.  
  141. void MD_InfoDriver(void)
  142. {
  143.     int t;
  144.     DRIVER *l;
  145.  
  146.     /* list all registered devicedrivers: */
  147.  
  148.     for(t=1,l=firstdriver; l!=NULL; l=l->next, t++){
  149.         printf("%d. %s\n",t,l->Version);
  150.     }
  151. }
  152.  
  153.  
  154. void MD_RegisterDriver(DRIVER *drv)
  155. {
  156.     if(firstdriver==NULL){
  157.         firstdriver=drv;
  158.         drv->next=NULL;
  159.     }
  160.     else{
  161.         drv->next=firstdriver;
  162.         firstdriver=drv;
  163.     }
  164. }
  165.  
  166.  
  167. SWORD MD_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags)
  168. {
  169.     SWORD result=md_driver->SampleLoad(fp,size,reppos,repend,flags);
  170.     SL_Exit();
  171.     return result;
  172. }
  173.  
  174.  
  175. void MD_SampleUnLoad(SWORD handle)
  176. {
  177.     md_driver->SampleUnLoad(handle);
  178. }
  179.  
  180.  
  181. BOOL MD_Init(void)
  182. {
  183.     UWORD t;
  184.  
  185.     /* if md_device==0, try to find a device number */
  186.  
  187.     if(md_device==0){
  188.  
  189.         for(t=1,md_driver=firstdriver; md_driver!=NULL; md_driver=md_driver->next, t++){
  190.             if(md_driver->IsPresent()) break;
  191.         }
  192.  
  193.         if(md_driver==NULL){
  194.             myerr="You don't have any of the supported sound-devices";
  195.             return 0;
  196.         }
  197.  
  198.         md_device=t;
  199.     }
  200.  
  201.     /* if n>0 use that driver */
  202.  
  203.     for(t=1,md_driver=firstdriver; md_driver!=NULL && t!=md_device; md_driver=md_driver->next, t++);
  204.  
  205.     if(md_driver==NULL){
  206.         myerr="Device number out of range";
  207.         return 0;
  208.     }
  209.  
  210.     return(md_driver->Init());
  211. }
  212.  
  213.  
  214. void MD_Exit(void)
  215. {
  216.     md_driver->Exit();
  217. }
  218.  
  219.  
  220. void MD_PlayStart(void)
  221. {
  222.     /* safety valve, prevents entering
  223.        playstart twice: */
  224.  
  225.     if(isplaying) return;
  226.     md_driver->PlayStart();
  227.     isplaying=1;
  228. }
  229.  
  230.  
  231. void MD_PlayStop(void)
  232. {
  233.     /* safety valve, prevents calling playStop when playstart
  234.        hasn't been called: */
  235.  
  236.     if(isplaying){
  237.         isplaying=0;
  238.         md_driver->PlayStop();
  239.     }
  240. }
  241.  
  242.  
  243. void MD_SetBPM(UBYTE bpm)
  244. {
  245.     md_bpm=bpm;
  246. }
  247.  
  248.  
  249. void MD_RegisterPlayer(void (*player)(void))
  250. {
  251.     md_player=player;
  252. }
  253.  
  254.  
  255. void MD_Update(void)
  256. {
  257.     if(isplaying) md_driver->Update();
  258. }
  259.  
  260.  
  261. void MD_VoiceSetVolume(UBYTE voice,UBYTE vol)
  262. {
  263.     md_driver->VoiceSetVolume(voice,vol);
  264. }
  265.  
  266.  
  267. void MD_VoiceSetFrequency(UBYTE voice,ULONG frq)
  268. {
  269.     md_driver->VoiceSetFrequency(voice,frq);
  270. }
  271.  
  272.  
  273. void MD_VoiceSetPanning(UBYTE voice,ULONG pan)
  274. {
  275.     md_driver->VoiceSetPanning(voice,pan);
  276. }
  277.  
  278.  
  279. void MD_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags)
  280. {
  281.     md_driver->VoicePlay(voice,handle,start,size,reppos,repend,flags);
  282. }
  283.